<?php

namespace app\home\controller\product;

use app\BaseController;
use app\common\model\MoneyLog;
use app\common\model\TouziProduct as models;
use app\common\model\TouziProductClass;
use app\common\model\TouziProductOrder;
use app\common\model\User;
use app\common\traites\PublicCrudTrait;
use think\facade\Db;
use think\facade\Queue;
use hg\apidoc\annotation as Apidoc;

/**
 *
 * @Apidoc\Title("产品处理")
 * */
class Product extends BaseController
{
    protected $model;
    use PublicCrudTrait;

    public function initialize()
    {
        $this->model = new models();
        parent::initialize(); // TODO: Change the autogenerated stub
    }

    /**
     * @Apidoc\Title("产品列表 可用通过类型筛选")
     * @Apidoc\Method("POST")
     * @Apidoc\Param("class_type_id", type="varchar",require=true, desc="产品类型 1，2，3")
     * @Apidoc\Returned("data", type="array", desc="返回结果")
     */
    public function product_list()
    {
        $post = $this->request->post();
        $where = array();
        if (isset($post['class_type_id']) && !empty($post['class_type_id'])) {
            $where[] = array('class_type_id', '=', $post['class_type_id']);
        }
        $res = $this->model->field('*')
            ->where(['is_open' => 1, 'status' => 1])
            ->where($where)
            ->order('list_order asc')
            ->select();
        return show($res);
    }

    /**
     * @Apidoc\Title("产品类别 用户可选")
     * @Apidoc\Method("POST")
     * @Apidoc\Returned("data", type="array", desc="返回结果")
     */
    public function product_type_user()
    {
        $uid = session('home_user.id');
        $TouziProductClass = new TouziProductClass();
        $user = new User();
        $res_user = $user->where('id', $uid)->value('product_class');
        if ($res_user) {
            $res = $TouziProductClass->where('id', 'in', $res_user)->field('id,name')->select();
        } else {
            $res = $TouziProductClass->where('id', 99999)->field('id,name')->select();
        }
        return show($res);
    }

    /**
     * @Apidoc\Title("产品类别 全部")
     * @Apidoc\Method("POST")
     * @Apidoc\Returned("data", type="array", desc="返回结果")
     */
    public function product_type_all()
    {
        $TouziProductClass = new TouziProductClass();
        $res = $TouziProductClass->field('*')->select()->toArray();
        return show($res);
    }

    /**
     * @Apidoc\Title("产品详情")
     * @Apidoc\Method("POST")
     * @Apidoc\Param("id", type="varchar",require=true, desc="产品ID")
     * @Apidoc\Returned("data", type="array", desc="返回结果")
     */
    public function product_detail()
    {
        //过滤数据
        $postField = 'id';
        $post = $this->request->only(explode(',', $postField), 'post', null);
        // 判断产品是否 上架 并且正常的
        $res = $this->model->find($post['id']);
        $res['product_describe'] = htmlspecialchars_decode($res['product_describe']);
        if (!$res) {
            return show([], config('ToConfig.http_code.error'), 'The product does not exist, please try again later');
        }
        return show($res);
    }

    /**
     *
     * @Apidoc\Title("购买产品")
     * @Apidoc\Method("POST")
     * @Apidoc\Param("id", type="varchar",require=true, desc="产品ID")
     * @Apidoc\Returned("data", type="array", desc="返回结果")
     * */
    public function product_buy()
    {
        $uid = session('home_user.id');
        //过滤数据
        $postField = 'id,withdraw_pwd';
        $post = $this->request->only(explode(',', $postField), 'post', null);
        // 判断产品是否 上架 并且正常的
        $res = $this->model->find($post['id'])->toArray();
        $class_type_id = $res['class_type_id'];

        if (!$res) {
            return show([], config('ToConfig.http_code.error'), '物品不存在');
        }
        // 获取当前 用户 全部信息
        $res_user = User::find($uid);

        // 检测产品 限购 xiangou
        $map_xiangou = [];
        $map_xiangou['is_send'] = 0;
        $map_xiangou['user_id'] = $uid;
        $map_xiangou['order_status'] = 0;
        $buy_ok_number = TouziProductOrder::where($map_xiangou)->count();
        if ($buy_ok_number >= $res['xiangou']) {
            return show([], config('ToConfig.http_code.error'), '超过限购额度');
        }
        //检测余额
        if($class_type_id == 2){
            // 一类产品
            if ($res_user['money_balance'] < $res['buy_price'] || $res_user['money_balance'] <= 0) {
                return show([], config('ToConfig.http_code.error'), '账号余额不足');
            }
        }
        if($class_type_id == 3){
            // 一类产品
            if ($res_user['money_balance'] < $res['buy_price'] || $res_user['money_balance'] <= 0) {
                return show([], config('ToConfig.http_code.error'), '账号余额不足');
            }
        }
        if($class_type_id == 1){
            // 二类产品
            if ($res_user['money_juanzeng'] < $res['buy_price'] || $res_user['money_juanzeng'] <= 0) {
                return show([], config('ToConfig.http_code.error'), '账号余额不足');
            }
        }
        
        //检测 支付密码
        // if (pwdEncryption($post['withdraw_pwd']) != $res_user['withdraw_pwd']) {
        //     return show([], config('ToConfig.http_code.error'), '支付密码错误');
        // }

        //开启缓存 | 防止重复点击 | 需要服务器开启 redis 支持
        $key = 'buy_pro' . $uid . $res['id'];
        if (!start_concurrent($key)) {
            return show([], config('ToConfig.http_code.error'), '请勿重复点击购买');
        }

        Db::startTrans();
        try {
            $data = [];
            $data['order_no'] = orderCode('CP');
            $data['user_id'] = $uid;
            $data['user_name'] = $res_user['user_name'];
            $data['order_status'] = 0;
            $data['product_id'] = $res['id'];
            $data['pic_path'] = $res['pic_path'];
            $data['validity_period'] = $res['validity_period'];
            $data['class_name'] = $res['class_name'];
            $data['class_type_id'] = $res['class_type_id'];
            $data['product_title'] = $res['title'];
            $data['create_time'] = date('Y-m-d H:i:s');
            $data['start_time'] = date('Y-m-d');
            $data['end_time'] = date('Y-m-d', (time() + $res['validity_period'] * 86400));
            // $data['last_send_time']=date('Y-m-d');
            // $data['send_times']=date('Y-m-d');
            // $data['send_money_all']=date('Y-m-d');
            $data['gain_day'] = $res['gain_day'];
            $data['gain_all'] = $res['gain_day'] * $res['validity_period'];
            $data['buy_price'] = $res['buy_price'];
            $data['product_dis_1']  =   $res['buy_price'] * $res['product_dis_1']; // 一级返佣 金额
            $data['product_dis_2']  =   $res['buy_price'] * $res['product_dis_2']; // 二级返佣 金额
            $data['product_dis_3']  =   $res['buy_price'] * $res['product_dis_3']; // 三级返佣 金额
            $data['agent_id_1'] = $res_user['agent_id_1']; // 一级代理 人
            $data['agent_id_2'] =$res_user['agent_id_2']; // 二级代理 人
            $data['agent_id_3'] =$res_user['agent_id_3']; // 三级代理 人
            $data['agent_up_ids']=$res_user['agent_up_ids']; // 无限 代理 人
            //$data['money_fanli']=$res['money_fanli'];
            //$data['health_point']=$res['health_point'];

            $order_id = (new TouziProductOrder)->insertGetId($data);
            // 加入 返佣 队列
            // Queue::push('\app\job\ShouYiQueue', json_encode(['id' => $order_id]), 'ShouYiQueue');

            //抵扣余额
            if($class_type_id == 3){
                User::decreaseBy('money_balance', $uid, $res['buy_price']);
                // 还送一个 东西
                User::increaseBy('money_guozhai', $uid, $res['fanyong_guozhai']);
                // 记录所有的捐赠金增加的记录
                User::increaseBy('juan_all_money', $uid, $res['buy_price']);
                MoneyLog::flowing(1, 1, 1, 117, $res_user, $res['buy_price'], $order_id, '购买产品返佣','money_guozhai');
                //记录 产品 购买 消耗日志
                MoneyLog::flowing(2, 2, 1, 203, $res_user, $res['buy_price'], $order_id, '购买产品消耗','money_balance');
            }
            if($class_type_id == 2){
                User::decreaseBy('money_balance', $uid, $res['buy_price']);
                // 还送一个 东西
                User::increaseBy('money_juanzeng', $uid, $res['fanyong_gongyijin']);
                // 记录所有的捐赠金增加的记录
                User::increaseBy('juan_all_money', $uid, $res['buy_price']);
                MoneyLog::flowing(1, 1, 1, 117, $res_user, $res['buy_price'], $order_id, '购买产品返佣','money_juanzeng');
                //记录 产品 购买 消耗日志
                MoneyLog::flowing(2, 2, 1, 203, $res_user, $res['buy_price'], $order_id, '购买产品消耗','money_balance');
            }
            if($class_type_id == 1){ // 	
                User::decreaseBy('money_juanzeng', $uid, $res['buy_price']);
                // 记录所有的捐赠金增加的记录
                User::increaseBy('juan_all_money', $uid, $res['buy_price']);
                //记录 产品 购买 消耗日志
                MoneyLog::flowing(2, 2, 1, 203, $res_user, $res['buy_price'], $order_id, '购买产品消耗','money_juanzeng');
            }
            
            
            //增加 累计购买 记录
            // Db::name('common_user')->where('id', $uid)->inc('money_all_buy', $res['buy_price'])->update();

            //分享人
            if ($res_user['agent_id_1'] > 0) {
                // 找到这个人
                $agentId = $res_user['agent_id_1'];
                $money = $data['product_dis_1'];
                $top_user = Db::name('common_user')->where('id',  $agentId)->find();
                

                // 普通物品
                if($class_type_id == 2){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                // 普通物品
                if($class_type_id == 3){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                // 捐赠物品
                // if($class_type_id == 1){
                //     //增加 收益 
                //     Db::name('common_user')->where('id',  $agentId)->inc('money_juanzeng', $money)->update();
                //     //记录 日志
                //     MoneyLog::flowing(1, 1, 1, 304, $top_user, $money, $order_id, '购买产品推广人返 佣金到钱包', 'money_juanzeng');
                // }
            }

            if ($res_user['agent_id_2'] > 0) {
                // 找到这个人
                $agentId = $res_user['agent_id_2'];
                $money = $data['product_dis_2'];
                $top_user = Db::name('common_user')->where('id',  $agentId)->find();
                

                // 普通物品
                if($class_type_id == 2){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                if($class_type_id == 3){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                // 捐赠物品
                // if($class_type_id == 1){
                //     //增加 收益 
                //     Db::name('common_user')->where('id',  $agentId)->inc('money_juanzeng', $money)->update();
                //     //记录 日志
                //     MoneyLog::flowing(1, 1, 1, 304, $top_user, $money, $order_id, '购买产品推广人返 佣金到钱包', 'money_juanzeng');
                // }
            }

            if ($res_user['agent_id_3'] > 0) {
                // 找到这个人
                $agentId = $res_user['agent_id_3'];
                $money = $data['product_dis_3'];
                $top_user = Db::name('common_user')->where('id',  $agentId)->find();
                

                // 普通物品
                if($class_type_id == 2){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                if($class_type_id == 3){
                    //增加 收益 
                    Db::name('common_user')->where('id',  $agentId)->inc('money_balance', $money)->update();
                    //记录 日志
                    MoneyLog::flowing(1, 1, 1, 303, $top_user, $money, $order_id, '购买产品推广人返佣金到钱包', 'money_balance');
                }

                // 捐赠物品
                // if($class_type_id == 1){
                //     //增加 收益 
                //     Db::name('common_user')->where('id',  $agentId)->inc('money_juanzeng', $money)->update();
                //     //记录 日志
                //     MoneyLog::flowing(1, 1, 1, 304, $top_user, $money, $order_id, '购买产品推广人返 佣金到钱包', 'money_juanzeng');
                // }
            }

            // 执行 提交
            Db::commit();
            end_concurrent($key); // 清除缓存


            return show([]);
        } catch (\Exception $e) {
            Db::rollback();
            end_concurrent($key);// 清除缓存
            // 验证失败 输出错误信息
            return show([], config('ToConfig.http_code.error'), $e->getMessage());
        }
    }

    
// 类结束了
}
